import os

class Foo:
	def instance():
		global inst
		try:
			inst
		except:
			inst = Foo()
		return inst
		
该实现的优点就是简单和直观，但缺点也同样明显：
	1.需要客户代码显式知道一个叫instance()的方法来创建该类的对象；
	2.在并发环境下这种实现并不可靠
	
###########################################################
class Singleton(object):   
    objs = {}
    def __new__(cls, *args, **kv):
        if cls in cls.objs:
            return cls.objs[cls]
        cls.objs[cls] = object.__new__(cls)
		
###########################################################
class Singleton(object):
    objs = {}
    objs_locker =  threading.Lock()

    def __new__(cls, *args, **kv):
        if cls in cls.objs:
            return cls.objs[cls]

        cls.objs_locker.acquire()
        try:
            if cls in cls.objs: 
                return cls.objs[cls]
            cls.objs[cls] = object.__new__(cls)
        finally:
            cls.objs_locker.release()



############################################################
class Singleton(object):
   
    objs = {}
    objs_locker =  threading.Lock()

    def __new__(cls, *args, **kv):
        if cls in cls.objs:
            return cls.objs[cls]['obj']

        cls.objs_locker.acquire()
        try:
            if cls in cls.objs:
                return cls.objs[cls]['obj']
            obj = object.__new__(cls)
            cls.objs[cls] = {'obj': obj,'init': False}
            setattr(cls, '__init__',cls.decorate_init(cls.__init__))
            return cls.objs[cls]['obj']
        finally:
            cls.objs_locker.release()
		return obj
   
    @classmethod
    def decorate_init(cls, fn):
        def init_wrap(*args):
            if not cls.objs[cls]['init']:
                fn(*args)
                cls.objs[cls]['init'] = True
            return

        return init_wrap


我的回答是：根据情况而定。
如果你的运行环境不存在并发的情况，而且客户代码对额外的工作量（记住instance()这个函数）不在意的话，本文最开始的那段代码是最适合的；
即使存在并发环境，但客户代码对额外的工作量（除了记住每个实例化函数，还要记得在同一个地方调用，并且要保证调用顺序）还是不太在意的话，那就在程序启动阶段初始化所有的单件实例，本文最开始的那段代码还是很合适的；
如果有并发存在，并且客户很懒（懒是程序员的一种美德），不愿意记住太多和业务无关的东西，也不愿意费神集中初始化单件，并且还要保证初始化顺序，而且集中初始化在某些情况下（如有插件的系统中）是不可能的，那么还是使用最后这段复杂的代码吧。		